import uvicorn
from fastapi import FastAPI, File, UploadFile
from typing import List

app = FastAPI()

'''
# file 参数类型是字节 bytes
@app.post('/files/')
async def create_file(file: bytes = File(...)):
    return {"file_size": len(file)}


# file 参数类型是 UploadFile
@app.post('/uploadfile/')
async def create_upload_file(file: UploadFile = File(...)):
    result = {
        "filename": file.filename,
        "content-type": file.content_type,
        "read": await file.read()
    }
    return result

'''

'''
    因为 UploadFile 对象提供的方法都是 async 异步的，所以调用的时候都要加 await 比如 await file.read() （后面会详解 async/await ）
    
    UploadFIle 具有以下 async 异步方法
    write(data)：写入data ( str 或 bytes ) 到文件
    read(size)：读取文件的 size (int) 个字节/字符
    seek(offset)：转到文件中的字节位置 offset(int)，如： await myfile.seek(0)  将转到文件的开头
    close()：关闭文件
'''


# 上传多个文件的栗子
@app.post("/files/")
async def create_files(files: List[bytes] = File(...)):
    return {"file_sizes": [len(file) for file in files]}


@app.post("/uploadfiles/")
async def create_upload_files(files: List[UploadFile] = File(...)):
    return {"filenames": [file.filename for file in files]}


if __name__ == "__main__":
    uvicorn.run(app="main:app", host="127.0.0.1", port=8000, reload=True, debug=True)
